package com.huantai.common.util.secret;

import com.huantai.common.enums.ReplacementCharEnum;
import com.huantai.common.util.StringUtil;

/**
 * 信息脱敏工具类
 * 
 * @author Ma Chao
 * @version 2018年3月22日 下午1:18:11
 */
public final class InfoDesensitizationUtil {
    private InfoDesensitizationUtil() {}

    /**
     * 字符串脱敏： 保留目标字符串的左边 leftHold 个字符和右边 rightHold 个字符， 其余字符替换为 ReplacementCharEnum 中对应的字符
     * 
     * @param value 要脱敏的字符串
     * @param replacementChar 敏感数据替换成的字符
     * @param leftHold 从左边数要保留原始数据的字符个数
     * @param rightHold 从右边数要保留原始数据的的字符个数
     * @return 脱敏后的字符串
     */
    public static String desensitization(String value, ReplacementCharEnum replacementChar,
            int leftHold, int rightHold) {
        StringBuilder result = new StringBuilder();
        // 目标为空时，直接返回
        if (StringUtil.isEmpty(value)) {
            return value;
        }
        // 目标字符串长度
        int length = value.length();

        // 要保留的字符长度大于目标本身长度时，直接返回
        if ((leftHold + rightHold) >= length || leftHold >= length || rightHold >= length) {
            return value;
        }

        // 左边保留字符串
        String left = "";
        if (leftHold > 0) {
            left = value.substring(0, leftHold);
        }

        // 右边保留字符串
        String right = "";
        if (rightHold > 0) {
            right = value.substring(length - rightHold);
        }

        // 脱敏字符串
        String middle = repeat(length - leftHold - rightHold, replacementChar);

        return result.append(left).append(middle).append(right).toString();
    }

    /**
     * 获得由length个脱敏字符组成的脱敏字符串
     *
     * @param count 个数
     * @param replacementChar 敏感数据替换成的字符
     * @return 脱敏字符串
     */
    private static String repeat(int count, ReplacementCharEnum replacementChar) {
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < count; i++) {
            result.append(replacementChar.getValue());
        }
        return result.toString();
    }
}
